#ifndef SPREADSHEETMODEL_H
#define SPREADSHEETMODEL_H

//数据模型类 数据存储与业务逻辑
#include <QAbstractTableModel>
#include <QStandardItemModel>
#include <QVector>
#include <QMap>
#include <QSet>
#include <QFont>
#include <QColor>
#include <QVariant>
#include <QItemSelection>
#include <QUndoStack>
#include <QUndoView>
#include "formulaEvaluator.h"
#include <QDebug>

class SpreadsheetModel : public QStandardItemModel
{
    Q_OBJECT
public:
    //初始化
    explicit SpreadsheetModel(int rows, int columns, QObject *parent = nullptr);
    ~SpreadsheetModel();

public:

    /*模型数据导入导出*/
    friend QDataStream &operator<<(QDataStream &out, const SpreadsheetModel &model);// 用于导出模型数据
    friend QDataStream &operator>>(QDataStream &in, SpreadsheetModel &model);;// 用于导入模型数据

    /*刷新*/
    void beginModelReset() { beginResetModel(); }  // 预备刷新
    void endModelReset() { endResetModel(); }//刷新

    /*行列数据*/
    QVariantList getRowData(int row);//获取行数据
    QVariantList getColData(int Col);//获取列数据
    void setRowData(int row, const QVariantList &data);//恢复行数据
    void setColData(int col, const QVariantList &data);//恢复列数据
    void sortColumn(int column, Qt::SortOrder order = Qt::AscendingOrder, bool caseSensitive = false);// 列排序
    void sortRow(int row, Qt::SortOrder order = Qt::AscendingOrder, bool caseSensitive = false);//行排序
    static bool compareVariants(const QVariant &v1, const QVariant &v2,  bool caseSensitive = false, Qt::SortOrder order = Qt::AscendingOrder);//排序辅助方法

    /*命令栈*/
    void setUndoStack(QUndoStack* undoStack);//设置命令栈
    QUndoStack* undoStack() const;         // 获取命令栈
    void beginUndoRedo();//标记开始撤销重做
    void endUndoRedo();//标记结束撤销重做

    //辅助函数
    void setCaseSensitiveSort(bool enabled) { m_caseSensitiveSort = enabled; }//设置大小写是否敏感
    QVector<QVector<QVariant>> getAllData() const;// 获取当前所有数据
    void setAllData(const QVector<QVector<QVariant>>& data);// 批量设置数据（带撤销支持）
    QVariant calculateFormula(const QString& formula, const QModelIndex &index)const;//计算公式值

public:
    //重写函数
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;//表头设置
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;//设置数据项函数
    QVariant data(const QModelIndex &index, int role) const override;//读取数据

signals:
    //信号
    void dataChangedEx(const QModelIndex &index, const QVariant &oldValue, const QVariant &newValue);//数据项修改信号

public:
    //成员变量
    QUndoStack* m_undoStack = nullptr;//命令栈
    bool undoredoprogress;//记录是否撤销操作
    bool m_caseSensitiveSort;//记录排序是否大小写敏感
    enum StatType {// 统计计算类型
        Sum,
        Average,
        Max,
        Min
    };
    Q_ENUM(StatType)// 统计类型枚举
    FormulaEvaluator m_evaluator;  // 公式计算器
};

// 序列化操作符重载
QDataStream &operator<<(QDataStream &out, const SpreadsheetModel &model);
QDataStream &operator>>(QDataStream &in, SpreadsheetModel &model);

#endif // SPREADSHEETMODEL_H


